<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=1000, initial-scale=1.0">
    <title>数据清洗操作记录</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
    <style>
        #app {
            width: 1300px;
            margin: 55px auto;
            font-family: "Microsoft YaHei", "SimSun", "Arial", sans-serif;
        }

        table,
        th,
        td {
            border: 1px solid #e0e0e0;
            border-collapse: collapse;
        }

        th,
        td {
            padding: 6px 10px;
            text-align: left;
        }

        th {
            background-color: #bfbfbf;
        }

        h1,
        h2,
        h3,
        h4 {
            color: #000;
            margin-top: 20px;
            margin-bottom: 10px;
        }

        p {
            margin-bottom: 10px;
        }

        table.information-table {
            width: 100%;
            border: none;
            margin-bottom: 10px;
        }

        table.information-table td {
            border: none;
            vertical-align: top;
        }

        .red-text {
            color: red;
        }
    </style>
</head>

<body>
    <div id="app"></div>
    <script type="module">
        const { createApp, ref, reactive, onMounted } = Vue;

        createApp({
            setup() {


                // 假设 htmlContent 是你要生成 docx 的 HTML 字符串
                // const htmlContent = `
                //     <html>
                //       <body>
                //         <h1>测试报告</h1>
                //         <p>这是一个自动生成的docx测试。</p>
                //       </body>
                //     </html>
                // `;
                const formattedDate = (now) => {
                    return `${now.getFullYear()}/${now.getMonth() + 1}/${now.getDate()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`
                };
                // console.log(formattedDate);
                const download_doc = () => {
                    const appElement = document.getElementById('app');
                    const htmlContent = appElement.innerHTML;
                    // 发送 POST 请求并下载 docx
                    fetch('http://127.0.0.1:6733/api/html2docx', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json'
                        },
                        body: JSON.stringify({ html: htmlContent })
                    })
                        .then(response => {
                            if (!response.ok) throw new Error('网络错误');
                            return response.blob();
                        })
                        .then(blob => {
                            // 创建一个临时链接用于下载
                            const url = window.URL.createObjectURL(blob);
                            const a = document.createElement('a');
                            a.href = url;
                            a.download = 'report.docx'; // 下载文件名
                            document.body.appendChild(a);
                            a.click();
                            a.remove();
                            window.URL.revokeObjectURL(url);
                        })
                        .catch(error => {
                            alert('生成或下载失败: ' + error.message);
                        });
                }
                // setTimeout(()=>{
                //     download_doc()
                // },3000)
                var f_m = 0;
                const title = ref('检验鉴定原始记录');
                var jcid = "";
                var jcmc = "";
                var before_clean_data = "";
                var cleaned_data = "";
                var unique_can_open_files = 0; //有效文件
                const info = reactive({
                    jcid: "",
                    left: [
                        { label: '鉴定受理号', value: 'XXX' },
                        { label: '检材编号', value: 'XXXX' }
                    ],
                    right: [
                        { label: '鉴定方法编号', value: 'GA/T XXXX' },
                        { label: '检验人', value: 'AAA' },
                        { label: '校核人', value: 'CCCC' },
                        { label: '开始时间', value: '202X年XX月XX日XX时XX分' },
                        { label: '结束时间', value: '202X年XX月XX日XX时XX分' }
                    ]
                });
                const sections = reactive({
                    section1: {
                        title: '一、检验环境',
                        content1: '1、设备（编号）：110XXXX',
                        content2: '2、软件（版本）：XXXX软件（v3.2）'
                    },
                    section2: {
                        title: '二、检验过程',
                        subsection2_1: {
                            title: '1.接受检材',
                            content: 'XXX年XX月XX日, 接受委托单位XXXX送检光盘XX张，编为（时间+案件编号+检材类别+序号）号检材，正反面照片见图1。'
                        },
                        subsection2_2: {
                            title: '2.系统杀毒',
                            content: '启动编号为110XXXX的检验设备，XXX系统启动正常，用XXX杀毒软件对上述设备杀毒后，没有病毒。'
                        },
                        subsection2_3: {
                            title: '3.检材读取',
                            content: 'XXX年XX月XX分, 启动XXX软件系统对检材（检材编号XXXX）进行扫描，检材包含XXX个文件，包括xxx格式，其属性见下表（前10条），全量详情见附件001检材属性表。'
                        },
                        subsection2_4: {
                            title: '4.检材保全备份',
                            content: 'XXX年XX月XX分, XXX软件系统对检材（检材编号XXXX）进行保全备份，备份检材包含XXX个文件，包括xxx格式，其属性见下表（前10条），全量详情见附件002检材保全备份属性表。'
                        },
                        backupNotice: '以上保全备份的检材与原始检材文件数量、SH256值完全一致。'
                    },
                    section3: {
                        title: '三、检材文件预检操作记录'
                    },
                    fileDecrypt: {
                        title: '文件解密',
                        content: '检材XXXX中有XX个文件进行了加密，其中XX个文件自动获得了密码，XXX个文件需要委托方提供密码，详见下表：'
                    },
                    fileArchive: {
                        title: '文件解压',
                        content: '检材XXXX中有XX个压缩文件，每个压缩文件包含的文件数量如下表（前10），详情见附件003检材压缩文件属性表：'
                    },
                    fileDuplicate: {
                        title: '重复文件判断',
                        content: '系统根据哈希算法判断检材中文件的SHA256值是否相同，确定是否为重复文件，判定结果如下表（前10），详情见附件005检材重复文件列表。'
                    },
                    fileInvalid: {
                        title: '无效文件识别',
                        content: '根据无效数据的认定规则，系统对无效文件进行分类识别，XX个文件字节数为0；XX个文件无法打开；XX个文件损坏；无效文件列表如下表（前10个），详情见附件006无效文件列表。'
                    },
                    fundMerge: {
                        title: '四、资金数据归并与格式转化',
                        fundMergeContent: {
                            title: '资金数据归并',
                            content: '对待检的检材XX个文件进行相同字段要素项分类合并，发现匹配以下的资金数据模板结构和记录数。'
                        }
                    },
                    formatConversion: {
                        title: '格式转化',
                        content: 'XX软件对资金数据的时间、数值类型进行了规范化转化，结果如下表。'
                    },
                    fundCleaning: {
                        title: '五、资金数据清洗和标记',
                        intro: '使用XX软件的资金数据清洗功能对资金数据进行清洗，发现以下的资金数据存在以下的一些异常。',
                        summary: '经过清洗操作，共清洗了XX无效数据，交易失败数据XX，冲正数据XXX条。'
                    },
                    dataCompletion: {
                        title: '六、资金数据补全检验',
                        content: '发现XXX条的交易方的交易户名、交易证件号码缺失，XXX交易方的交易账户信息缺失，XX条交易对手的交易户名等信息缺失；采用账户信息进行补全，对XX条交易方的交易户名等信息进行了补全，对XX交易对手信息进行了补全。还有XX交易方的交易户名缺失。'
                    },
                    repeatabilityInspection: {
                        title: '七、资金数据重复性检验',
                        intro: '使用XX软件的资金数据去重功能发现资金交易明细数据存在重复，重复信息如下表（前10），详细信息见附件重复数据明细表。'
                    },
                    integrityInspection: {
                        title: '八、资金数据连续性检验',
                        intro: '对资金交易数据进行完整性检验，发现XX账户不完整，具体如下表。'
                    },
                    dataSummary: {
                        title: '九、交易数据汇总情况',
                        content: '通过以上对资金数据的清洗检验，检材XXXX，包含XXX文件，有效文件YYY个，归并到主体信息ZZZ条、账户信息AAA条，资金交易信息BBB条，清洗去重后的主体信息CCC条、账户信息DDD条，资金交易信息EEE条。对这些数据进行打包，形成附件xxx检材数据集.zip,其sha256校验值为xxxx10010019394。'
                    },
                    abnormalRecords: {
                        title: '十、检验异常情况记录',
                        intro: '异常数据问题',
                        detail: '通过检验，发现异常的数据集包括以下内容，详细见附件XXX检材异常数据。'
                    },
                    opinion: {
                        title: '鉴定意见及风险提示',
                        content: '本报告仅供参考，具体以实际数据为准。'
                    }
                });
                const tables = reactive({
                    jcDetailTable: {
                        columns: ['序号', '检材编号', '检材名称', '数量', '外观', '类别'],
                        data: [
                            { '序号': 1, '检材编号': '20250109-XXX-01-01', '检材名称': 'XXX案件资金电子数据', '数量': 1, '外观': '完好', '类别': '光盘' }
                        ]
                    },
                    jcReadTable: {
                        columns: ['检材序号', '检材文件名', '检材大小', '检材文件目录', '检材SHA256'],
                        data: [
                            { '检材序号': 1, '检材文件名': 'Xxx文件', '检材大小': '', '检材文件目录': 'XXX/xxx/xxx.xls', '检材SHA256': '32033r940239043209932099' }
                        ]
                    },
                    jcBackupTable: {
                        columns: ['备份检材序号', '备份文件名', '备份检材大小', '备份文件目录', '备份检材SHA256'],
                        data: [
                            { '备份检材序号': 1, '备份文件名': '备份文件1', '备份检材大小': '10MB', '备份文件目录': 'backup/xxx/', '备份检材SHA256': 'abc123sha256' }
                        ]
                    },
                    jcDecryptTable: {
                        columns: ['序号', '文件名', '文件格式', '检材目录', '能否解密', '密码'],
                        data: [
                            { '序号': 1, '文件名': 'Rar、zip...', '文件格式': '能', '检材目录': '1234', '能否解密': '是', '密码': '1234' },
                            { '序号': 2, '文件名': 'Excel', '文件格式': '不能', '检材目录': '无密码', '能否解密': '否', '密码': '' }
                        ]
                    },
                    jcArchiveTable: {
                        columns: ['序号', '压缩文件名', '文件格式', '文件目录', 'SHA256值', '包含文件数量'],
                        data: [
                            { '序号': 1, '压缩文件名': '压缩包1.zip', '文件格式': 'Zip', '文件目录': '/xxx/', 'SHA256值': '320432942', '包含文件数量': 20 }
                        ]
                    },
                    jcDupTable: {
                        columns: ['序号', '文件名', '文件格式', '检材目录', 'SHA256', '重复文件数量', '重复文件名称（多个用，隔开）'],
                        data: [
                            { '序号': 1, '文件名': 'D:/案件数据大本营/xxx.xls', '文件格式': 'Excel', '检材目录': '/xxx/', 'SHA256': 'sha256xxxx', '重复文件数量': 2, '重复文件名称（多个用，隔开）': 'xxx.xls, yyy.xls' }
                        ]
                    },
                    jcInvalidTable: {
                        columns: ['序号', '文件名', '文件格式', '检材目录', '无效原因', '文件大小', '标签'],
                        data: [
                            { '序号': 1, '文件名': 'Excel', '文件格式': '资金数据文件的大小字节数为0。', '检材目录': 0, '无效原因': '文件大小为0；无法打开；无法解压；解密失败；', '文件大小': '0B', '标签': '无效' }
                        ]
                    },
                    jcMergeTable: {
                        columns: ['序号', '资金数据模板', '匹配文件数', '记录数'],
                        data: [
                            { '序号': 1, '资金数据模板': '主体信息表（联系信息、住址信息）', '匹配文件数': 10, '记录数': 1000 },
                            { '序号': 2, '资金数据模板': '账户信息表', '匹配文件数': 20, '记录数': 20000 },
                            { '序号': 3, '资金数据模板': '交易明细信息表', '匹配文件数': 30, '记录数': 1900000 }
                        ]
                    },
                    jcFormatTable: {
                        columns: ['序号', '规则', '相关表', '记录数', '标记'],
                        data: [
                            { '序号': 1, '规则': '去除字符两边空格', '相关表': '资金交易明细', '记录数': 1000, '标记': '已处理' },
                            { '序号': 2, '规则': '时间转化YYYY-mm-dd hh:mm:ss', '相关表': '资金交易明细', '记录数': 1000, '标记': '已处理' },
                            { '序号': 3, '规则': '金额数值转化', '相关表': '资金交易明细', '记录数': 1000, '标记': '已处理' }
                        ]
                    },
                    jcCleanTable: {
                        columns: ['序号', '清洗规则', '相关表', '记录数', '标记', '标记的解释'],
                        data: [
                            { '序号': 1, '清洗规则': '交易时间为空', '相关表': '资金交易明细', '记录数': 1000, '标记': '无效数据', '标记的解释': '缺失时间' },
                            { '序号': 2, '清洗规则': '交易金额为空', '相关表': '资金交易明细', '记录数': 1000, '标记': '无效数据', '标记的解释': '缺失金额' }
                        ]
                    },
                    jcDupCheckTable: {
                        columns: ['序号', '重复规则', '相关表', '重复条数', '标记'],
                        data: [
                            { '序号': 1, '重复规则': '全字段相同', '相关表': '资金交易明细', '重复条数': 1000, '标记': '重复数据' },
                            { '序号': 2, '重复规则': '核心字段相同', '相关表': '资金交易明细', '重复条数': 1000, '标记': '重复数据' }
                        ]
                    },
                    jcIntegrityTable: {
                        columns: ['序号', '卡号', '账号', '借贷标志', '交易金额', '交易对手卡号', '交易对手账号', '净差（期初数+进帐金额-出账金额）', '完整性'],


                        data: [
                            { '序号': 1, '卡号': '6222****', '账号': '1234567890', '期初数': 1000, '进账额度': 5000, '出账额度': 4000, '期末数': 2000, '净差（期初数+进帐金额-出账金额）': 2000, '完整性': '不完整' }
                        ]
                    },
                    jcExceptionTable: {
                        columns: ['序号', '清洗规则', '相关表', '记录数', '标记'],
                        data: [
                            { '序号': 1, '清洗规则': '交易时间为空', '相关表': '资金交易明细', '记录数': 1000, '标记': '无效数据' },
                            { '序号': 2, '清洗规则': '交易金额为空', '相关表': '资金交易明细', '记录数': 1000, '标记': '无效数据' }
                        ]
                    }
                });

                onMounted(() => {
                    window.addEventListener('message', function (event) {
                        // 这里只是简单打印，可以根据需要处理
                        // console.log('test1.html 收到 message:', event.data);
                        let d = event.data;
                        if (d.type == "upload_complete_1") {
                            info.left[0].value = d.sample_id; // 受理号
                            jcid = d.sample_id;
                            jcmc = d.sample_name;

                            info.left[1].value = d.sample_name;
                            info.left[1].value = d.sample_id;
                            info.right[0].value = "GA/T 01"
                            info.right[1].value = "wlove"
                            info.right[2].value = ""
                            info.right[3].value = formattedDate(new Date(jcid * 1))
                            info.right[4].value = ""
                            // console.log(jcid * 1)
                            // console.log(formattedDate(new Date(jcid * 1)))
                            sections.section1.content1 = d.device_info; //设备信息
                            sections.section1.content2 = d.device_version; //系统名称
                            // 接受委托单位XXXX送检光盘XX张
                            sections.section2.subsection2_1.content = formattedDate(new Date(jcid * 1)) + ", 接受委托单位XXXX送检检材，" + "编为（时间+案件编号+检材类别+序号）" + jcid + "号检材，正反面照片见图1。";

                            sections.section2.subsection2_2.content = "启动编号为" + sections.section1.content1 + "的检验设备，" + sections.section1.content2 + "系统启动正常，用360杀毒软件对上述设备杀毒后，没有病毒。";


                            // tables 
                            tables.jcDetailTable.data[0] = {
                                '序号': 1, '检材编号': jcid, '检材名称': d.sample_name, '数量': 1, '外观': '完好', '类别': d.upload_device_info.device_type
                            }
                            console.log(tables.jcDetailTable.data, "tables.jcDetailTable.data")

                            // tables.jcDetailTable.data[0] = { 
                            //     '检材序号': 1, '检材文件名': d.sample_name, '检材大小': 0, '检材文件目录': '', '检材SHA256': ''
                            // }








                        }
                        if (d.type == "scan_complete_1_4") { // 检材扫描完成
                            let s = d.stats;
                            unique_can_open_files = s.unique_can_open_files
                            // console.log(1111111)
                            f_m = s.all_files.length; //文件数量
                            sections.section2.subsection2_3.content = formattedDate(new Date(jcid * 1)) + ", 启动" + sections.section1.content2 + "软件系统对检材（检材编号" + jcid + "）进行扫描，检材包含" + s.all_files.length + "个文件，包括" + Object.keys(s.all_file_type_counts) + "格式，其属性见下表（前10条），全量详情见附件001检材属性表。";

                            sections.section2.subsection2_4.content = formattedDate(new Date(jcid * 1)) + ', ' + sections.section1.content2 + '软件系统对检材' + jcid + '进行保全备份，备份检材包含' + s.all_files.length + '个文件，包括' + Object.keys(s.all_file_type_counts) + '格式，其属性见下表（前10条），全量详情见附件002检材保全备份属性表。';

                            sections.fileDecrypt.content = "检材" + jcid + "中有" + s.password_protected_archives.length + "个文件进行了加密，其中" + 0 + "个文件自动获得了密码，" + s.password_protected_archives.length + "个文件需要委托方提供密码，详见下表：";


                            sections.fileArchive.content = '检材' + jcid + '中有' + (s.extracted_archives_info.length + s.unreadable_archived_files.length) + '个压缩文件，每个压缩文件包含的文件数量如下表（前10），详情见附件003检材压缩文件属性表：';


                            sections.fileDuplicate.content = '系统根据哈希算法判断检材中文件的SHA256值是否相同，确定是否为重复文件，判定结果如下表（前10），详情见附件005检材重复文件列表。';  // s.duplicate_files_info


                            sections.fileInvalid.content = '根据无效数据的认定规则，系统对无效文件进行分类识别，XX个文件字节数为0；XX个文件无法打开；XX个文件损坏；无效文件列表如下表（前10个），详情见附件006无效文件列表。';//s.invalid_files_info


                            // sections.fundMerge.fundMergeContent.content = '对待检的检材XX个文件进行相同字段要素项分类合并，发现匹配以下的资金数据模板结构和记录数。';


                            tables.jcReadTable.data = [];
                            s.all_files_info.slice(0, 10).map((item, index) => {
                                tables.jcReadTable.data.push({
                                    '检材序号': index + 1, '检材文件名': item.file_name, '检材大小': item.file_size, '检材文件目录': item.file_name, '检材SHA256': item.sha256
                                })
                            })
                            tables.jcBackupTable.data = [];
                            s.all_files_info.slice(0, 10).map((item, index) => {
                                tables.jcBackupTable.data.push(
                                    { '备份检材序号': index + 1, '备份文件名': item.file_name, '备份检材大小': item.file_size, '备份文件目录': 'data/' + jcid + '/' + item.file_name, '备份检材SHA256': item.sha256 }
                                )
                            })

                            // 加密信息
                            tables.jcDecryptTable.data = [];
                            s.password_protected_archives.map((item, index) => {
                                console.log(item)
                                tables.jcDecryptTable.data.push(
                                    { '序号': index + 1, '文件名': item.archive_name, '文件格式': item.archive_format, '检材目录': item.archive_name, '能否解密': '否', '密码': '' }
                                )
                            })
                            // 解压信息
                            tables.jcArchiveTable.data = [];
                            s.extracted_archives_info.map((item, index) => {
                                console.log(item)
                                tables.jcArchiveTable.data.push(
                                    { '序号': index + 1, '压缩文件名': item.archive_name, '文件格式': item.archive_format, '文件目录': item.archive_name, 'SHA256值': item.sha256, '包含文件数量': item.contained_file_count }
                                )
                            })

                            // duplicate_files_info
                            tables.jcDupTable.data = []
                            s.duplicate_files_info.map((item, index) => {
                                tables.jcDupTable.data.push(
                                    { '序号': index + 1, '文件名': item.file_name, '文件格式': item.file_format, '检材目录': item.file_name, '重复文件数量': item.duplicate_count, '重复文件名称（多个用，隔开）': item.duplicate_names }
                                )
                            })
                            // 无效文件
                            tables.jcInvalidTable.data = []
                            s.invalid_files_info.map((item, index) => {
                                tables.jcInvalidTable.data.push(
                                    { '序号': index + 1, '文件名': item.file_name, '文件格式': item.file_format, '检材目录': item.file_name, '无效原因': item.invalid_reason, '文件大小': item.file_size, '标签': item.tags }
                                )
                            })




                        }

                        if (d.type == "matching_complete_1_5") { // 模版匹配完成 分类
                            let s = d.results.summary;
                            sections.fundMerge.fundMergeContent.content = '对待检的检材' + f_m + '个文件进行相同字段要素项分类合并，发现匹配以下的资金数据模板结构和记录数。';
                            tables.jcMergeTable.data = Object.values(s);

                            // 匹配文件分类数量
                            tables.jcMergeTable.data = []
                            Object.values(s).map((item, index) => {
                                tables.jcMergeTable.data.push(
                                    {
                                        '序号': index + 1, '资金数据模板': item['资金数据模板'], '匹配文件数': item['匹配文件数'], '记录数':
                                            item['行数']
                                    }
                                )
                                before_clean_data += (item['资金数据模板'] + item['行数'] + "条,");
                            })

                            //  jcMergeTable: {
                            //     columns: ['序号', '资金数据模板', '匹配文件数', '记录数'],
                            //     data: [
                            //         { '序号': 1, '资金数据模板': '主体信息表（联系信息、住址信息）', '匹配文件数': 10, '记录数': 1000 },
                            //         { '序号': 2, '资金数据模板': '账户信息表', '匹配文件数': 20, '记录数': 20000 },
                            //         { '序号': 3, '资金数据模板': '交易明细信息表', '匹配文件数': 30, '记录数': 1900000 }
                            //     ]
                            // },

                        }

                        if (d.type == "process_dataCleaning_optimized_1_9") { // 清洗完成
                            let s = d.results.summary;
                            sections.formatConversion.content = '使用' + sections.section1.content2 + '软件对资金数据的时间、数值类型进行了规范化转化，结果如下表。';

                            sections.fundCleaning.content = '使用' + sections.section1.content2 + '软件的资金数据清洗功能对资金数据进行清洗，发现以下的资金数据存在以下的一些异常。';


                            // 清洗普通规则
                            tables.jcFormatTable.data = []
                            Object.values(s).map((item, index) => {
                                tables.jcFormatTable.data.push(
                                    { '序号': index + 1, '清洗规则': item.rulename, '相关表': item.tablename, '记录数': item.num, '标记': item.bj, '标记的解释': item.bj }
                                )
                            })
                            //特殊清洗规则
                            tables.jcCleanTable.data = []
                            Object.values(s).map((item, index) => {
                                tables.jcCleanTable.data.push(
                                    { '序号': index + 1, '清洗规则': item.rulename, '相关表': item.tablename, '记录数': item.num, '标记': item.bj, '标记的解释': item.bj }
                                )
                            })


                            tables.jcExceptionTable.data = []
                            Object.values(s).map((item, index) => {
                                tables.jcExceptionTable.data.push(
                                    { '序号': index + 1, '清洗规则': item.rulename, '相关表': item.tablename, '记录数': item.num, '标记': item.bj, '标记的解释': item.bj }
                                )
                            })



                        }

                        if (d.type == "perform_data_enrichment_1_10") { //补全完成
                            sections.dataCompletion.content = '发现XXX条的交易方的交易户名、交易证件号码缺失，XXX交易方的交易账户信息缺失，XX条交易对手的交易户名等信息缺失；采用账户信息进行补全，对XX条交易方的交易户名等信息进行了补全，对XX交易对手信息进行了补全。还有XX交易方的交易户名缺失。'
                        }

                        if (d.type == "perform_data_duplication_1_12") {
                            sections.repeatabilityInspection.content = '使用' + sections.section1.content2 + '软件的资金数据去重功能发现资金交易明细数据存在重复，重复信息如下表（前10），详细信息见附件重复数据明细表。'

                            // 去重规则
                            tables.jcDupCheckTable.data = []
                            d.duplication_stats.map((item, index) => {
                                tables.jcDupCheckTable.data.push(
                                    { '序号': index + 1, '重复规则': item.rule, '相关表': item.table, '重复条数': item.count, '标记': item.bj },
                                )
                                cleaned_data += (item.table + item.count + "条,");
                            })


                        }
                        if (d.type == "perform_data_IntegralityCheck_1_14") {
                            // 完整性
                            tables.jcIntegrityTable.data = []
                            d.data.map((item, index) => {
                                tables.jcIntegrityTable.data.push(
                                    { '序号': index + 1, '卡号': item.jyf_yhkh, '账号': item.jyf_yhzh, '借贷标志': item.jdbz, '交易金额': item.jyje, '交易对手卡号': item.jyds_yhkh, '交易对手账号': item.jyds_yhzh, '净差（期初数+进帐金额-出账金额）': item.xy_cz, '完整性': '不完整' }
                                )
                            })


                            // 通过以上对资金数据的清洗检验，检材XXXX，包含XXX文件，有效文件YYY个，归并到主体信息ZZZ条、账户信息AAA条，资金交易信息BBB条，清洗去重后的主体信息CCC条、账户信息DDD条，资金交易信息EEE条。对这些数据进行打包，形成附件xxx检材数据集.zip,其sha256校验值为xxxx10010019394。
                            // dataSummary: {
                            //     title: '九、交易数据汇总情况',
                            //     content: '通过以上对资金数据的清洗检验，检材XXXX，包含XXX文件，有效文件YYY个，归并到主体信息ZZZ条、账户信息AAA条，资金交易信息BBB条，清洗去重后的主体信息CCC条、账户信息DDD条，资金交易信息EEE条。对这些数据进行打包，形成附件xxx检材数据集.zip,其sha256校验值为xxxx10010019394。'
                            // },
                            // abnormalRecords: {
                            //     title: '十、检验异常情况记录',
                            //     intro: '异常数据问题',
                            //     detail: '通过检验，发现异常的数据集包括以下内容，详细见附件XXX检材异常数据。'
                            // },

                            // Object.values(s).map((item,index)=>{
                            //     tables.jcMergeTable.data.push( 
                            //         { '序号': index+1, '资金数据模板': item['资金数据模板'], '匹配文件数': item['匹配文件数'], '记录数': 
                            //         item['行数'] }
                            //     ) 
                            // })
                            // before_clean_data = "";
                            // cleaned_data = item['资金数据模板']+item['行数']+"条,";
                            // 归并到主体信息ZZZ条、账户信息AAA条，资金交易信息BBB条，清洗去重后的主体信息CCC条、账户信息DDD条，资金交易信息EEE条。

                            sections.dataSummary.content = "通过以上对资金数据的清洗检验，检材" + jcid + "，包含" + f_m + "文件，有效文件" + unique_can_open_files.length + "个，归并到" + before_clean_data + cleaned_data + "。";
                            //对这些数据进行打包，形成附件xxx检材数据集.zip。,其sha256校验值为xxxx10010019394

                            sections.abnormalRecords.content = "通过检验，发现异常的数据集包括以下内容，详细见附件" + jcid + "检材异常数据。";
                            info.right[4].value = formattedDate(new Date())


                        }
                        if (d.type == "download_doc") {
                            setTimeout(() => {
                                download_doc()
                            }, 500)
                        }



                    });
                });

                return {
                    title, info, sections, tables
                }
            },
            template: `
                <h1 style="text-align: center;">{{ title }}</h1>
        <table class="information-table">
            <tr>
                <td>
                    <p>鉴定受理号：{{ info.left[0].value }}</p>
                    <p>检材编号：{{ info.left[1].value }}</p>
                </td>
                <td>
                    <p>鉴定方法编号：{{ info.right[0].value }}</p>
                    <p>检验人：{{ info.right[1].value }}</p>
                    <p>校核人：{{ info.right[2].value }}</p>
                    <p>开始时间：{{ info.right[3].value }}</p>
                    <p>结束时间：{{ info.right[4].value }}</p>
                </td>
            </tr>
        </table>
        <h2>{{ sections.section1.title }}</h2>
                <p>1、设备（编号）：{{ sections.section1.content1 }}</p>
                <p>2、软件（版本）：{{ sections.section1.content2 }}</p>
        <h2>{{ sections.section2.title }}</h2>
        <h3>{{ sections.section2.subsection2_1.title }}</h3>
        <p>{{ sections.section2.subsection2_1.content }}</p>
                <img src="http://192.168.1.3:8848/111.jpg" width = '100' height = '100' style="width:'100px';height:'100px'">
        <h4>检材明细列表如下：</h4>
        <table id="jc-detail-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcDetailTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcDetailTable.data" :key="index">
                    <td v-for="column in tables.jcDetailTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h3>{{ sections.section2.subsection2_2.title }}</h3>
        <p>{{ sections.section2.subsection2_2.content }}</p>
        <h3>{{ sections.section2.subsection2_3.title }}</h3>
        <p>{{ sections.section2.subsection2_3.content }}</p>
        <table id="jc-read-table">
            <thead>
                <tr>
                            <th v-for="column in tables.jcReadTable.columns" :key="column" style="width = '100px'">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcReadTable.data" :key="index">
                    <td v-for="column in tables.jcReadTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h3>{{ sections.section2.subsection2_4.title }}</h3>
        <p>{{ sections.section2.subsection2_4.content }}</p>
        <table id="jc-backup-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcBackupTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcBackupTable.data" :key="index">
                    <td v-for="column in tables.jcBackupTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <p class="red-text">{{ sections.section2.backupNotice }}</p>
        <h2>{{ sections.section3.title }}</h2>
        <h4>{{ sections.fileDecrypt.title }}</h4>
        <p>{{ sections.fileDecrypt.content }}</p>
        <table id="jc-decrypt-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcDecryptTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcDecryptTable.data" :key="index">
                    <td v-for="column in tables.jcDecryptTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h4>{{ sections.fileArchive.title }}</h4>
        <p>{{ sections.fileArchive.content }}</p>
        <table id="jc-archive-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcArchiveTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcArchiveTable.data" :key="index">
                    <td v-for="column in tables.jcArchiveTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h4>{{ sections.fileDuplicate.title }}</h4>
        <p>{{ sections.fileDuplicate.content }}</p>
        <table id="jc-dup-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcDupTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcDupTable.data" :key="index">
                    <td v-for="column in tables.jcDupTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h4>{{ sections.fileInvalid.title }}</h4>
        <p>{{ sections.fileInvalid.content }}</p>
        <table id="jc-invalid-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcInvalidTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcInvalidTable.data" :key="index">
                    <td v-for="column in tables.jcInvalidTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h2>{{ sections.fundMerge.title }}</h2>
        <h4>{{ sections.fundMerge.fundMergeContent.title }}</h4>
        <p>{{ sections.fundMerge.fundMergeContent.content }}</p>
        <table id="jc-merge-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcMergeTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcMergeTable.data" :key="index">
                    <td v-for="column in tables.jcMergeTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h4>{{ sections.formatConversion.title }}</h4>
        <p>{{ sections.formatConversion.content }}</p>
        <table id="jc-format-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcFormatTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcFormatTable.data" :key="index">
                    <td v-for="column in tables.jcFormatTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h2>{{ sections.fundCleaning.title }}</h2>
        <p>{{ sections.fundCleaning.intro }}</p>
        <table id="jc-clean-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcCleanTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcCleanTable.data" :key="index">
                    <td v-for="column in tables.jcCleanTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <p>{{ sections.fundCleaning.summary }}</p>
        <h2>{{ sections.dataCompletion.title }}</h2>
        <p>{{ sections.dataCompletion.content }}</p>
        <h2>{{ sections.repeatabilityInspection.title }}</h2>
        <p>{{ sections.repeatabilityInspection.intro }}</p>
        <table id="jc-dupcheck-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcDupCheckTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcDupCheckTable.data" :key="index">
                    <td v-for="column in tables.jcDupCheckTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h2>{{ sections.integrityInspection.title }}</h2>
        <p>{{ sections.integrityInspection.intro }}</p>
        <table id="jc-integrity-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcIntegrityTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcIntegrityTable.data" :key="index">
                    <td v-for="column in tables.jcIntegrityTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h2>{{ sections.dataSummary.title }}</h2>
        <p>{{ sections.dataSummary.content }}</p>
        <h2>{{ sections.abnormalRecords.title }}</h2>
        <p>{{ sections.abnormalRecords.intro }}</p>
        <p>{{ sections.abnormalRecords.detail }}</p>
        <table id="jc-exception-table">
            <thead>
                <tr>
                    <th v-for="column in tables.jcExceptionTable.columns" :key="column">{{ column }}</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(row, index) in tables.jcExceptionTable.data" :key="index">
                    <td v-for="column in tables.jcExceptionTable.columns" :key="column">{{ row[column] }}</td>
                </tr>
            </tbody>
        </table>
        <h3>{{ sections.opinion.title }}</h3>
        <p>{{ sections.opinion.content }}</p>
            `
        }).mount('#app');
    </script>
</body>

</html>